package com.sh.util;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class NacosConfigUtil {


    private static final Map<String, Properties> CONFIG_CACHE = new ConcurrentHashMap<>();

    private static String serverAddr;
    private static String group;
    private static String dataId;
    private static long timeout;

    /**
     * 初始化工具类
     *
     * @param serverAddr Nacos 服务器地址，例如 "127.0.0.1:8848"
     * @param group      配置组，例如 "DEFAULT_GROUP"
     * @param dataId     配置的 dataId
     * @param timeout    超时时间（毫秒）
     */
    public static void init(String serverAddr, String group, String dataId, long timeout) {
        NacosConfigUtil.serverAddr = serverAddr;
        NacosConfigUtil.group = group;
        NacosConfigUtil.dataId = dataId;
        NacosConfigUtil.timeout = timeout;
    }

    /**
     * 根据 key 从缓存中获取 value
     *
     * @param key 配置的 key
     * @return 对应的 value，如果缓存中没有则返回 null
     */
    public static String getValueByKey(String key) {
        // 从缓存中获取配置
        Properties properties = CONFIG_CACHE.get(buildCacheKey());
        return properties != null ? properties.getProperty(key) : null;
    }

    /**
     * 从 Nacos 获取所有配置并更新缓存
     *
     * @return 是否成功加载配置
     */
    public static boolean loadAllConfigFromNacos() {
        Properties properties = loadConfigFromNacos();
        if (properties != null) {
            CONFIG_CACHE.put(buildCacheKey(), properties);
            return true;
        }
        return false;
    }

    /**
     * 从 Nacos 拉取配置
     *
     * @return 配置内容（Properties 格式）
     */
    private static Properties loadConfigFromNacos() {
        try {
            ConfigService configService = NacosFactory.createConfigService(serverAddr);
            String content = configService.getConfig(dataId, group, timeout);
            Properties properties = new Properties();
            properties.load(new java.io.StringReader(content));
            return properties;
        } catch (NacosException | IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 构造缓存键
     *
     * @return 缓存键
     */
    private static String buildCacheKey() {
        return serverAddr + "|" + group + "|" + dataId;
    }

    /**
     * 清除缓存（可选）
     */
    public static void clearCache() {
        CONFIG_CACHE.remove(buildCacheKey());
    }

    public static void main(String[] args) {
        // 初始化工具类
        String serverAddr = "192.168.13.85:8848"; // Nacos 服务器地址
        String group = "DEFAULT_GROUP";       // 配置组
        String dataId = "application.properties";     // 配置的 dataId
        long timeout = 5000;                  // 超时时间
        NacosConfigUtil.init(serverAddr, group, dataId, timeout);

        // 从 Nacos 加载所有配置到缓存
        boolean success = NacosConfigUtil.loadAllConfigFromNacos();
        if (success) {
            System.out.println("配置加载成功并已缓存。");

            // 从缓存中获取配置值
            String key = "MYSQL_DB";
            String value = NacosConfigUtil.getValueByKey(key);
            System.out.println("Value for key '" + key + "' is: " + value);
        } else {
            System.out.println("配置加载失败。");
        }

        // 清除缓存
        NacosConfigUtil.clearCache();
        System.out.println("缓存已清除。");

        // 再次从缓存中获取配置值
        String key = "MYSQL_DB";
        String value = NacosConfigUtil.getValueByKey(key);
        System.out.println("Value for key '" + key + "' after cache clear is: " + value);
    }
}